package algo3.juegoCarmenSanDiego.controlador;

import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;

import org.xml.sax.SAXException;

import algo3.juegoCarmenSanDiego.modelo.Crimen;
import algo3.juegoCarmenSanDiego.modelo.Juego;
import algo3.juegoCarmenSanDiego.vista.Mostrador;
	
public class Controler {
	private static Juego juego;
	private static Crimen crimen;
	
	
	public static void main(String[] args) throws Exception {
		juego = new Juego();
		crimen = new Crimen();
		Mostrador unMostrador = new Mostrador(juego);
		unMostrador.mostrarTitulo();
		setearJugador(unMostrador);
		boolean juegoTerminado = false;
		while (!juegoTerminado){
			int unaOpcionDelJuego=unMostrador.opcionesPrincipales();
			switch(unaOpcionDelJuego){
			case 1:{
				juego.generarCaso();
				boolean casoTerminado = false;
				unMostrador.pantallaInicio(juego.getObjetoRobado(), juego.getNombreCiudadInicio());
				while(!casoTerminado){
					unMostrador.mostrarTiempoRestante(juego.getTiempoRestante());
					unMostrador.mostrarCiudadActual(juego.getCiudadDelPolicia());
					try{
						int unaOpcion = unMostrador.opcionesDelCaso();
						switch(unaOpcion) { 
						case 1: 
							casoTerminado = entrarAEdificio(unMostrador);
							break;
						case 2: 
							casoTerminado=viajarAunaCiudad(unMostrador);
							break;
						case 3:
							selectorCaracteristicas(unMostrador);
							break;
						case 4: 
							casoTerminado = true;
							break;
						default:{
							unMostrador.ingresarOpcionValida();
							break;
						}
						}
					}
					catch(NumberFormatException e){
						unMostrador.ingresarOpcionValida();
					}
				}
			}
			break;
			case 2:{
				juegoTerminado=true;
				break;
			}
			}
		}
	}
	private static void selectorCaracteristicas(Mostrador unMostrador) throws NumberFormatException, Exception{
		String caracteristica;
		boolean datosIngresadosIncorrectos = true;
		boolean pudoEmitirOrdenDeArresto=true;
		while(datosIngresadosIncorrectos && pudoEmitirOrdenDeArresto){
			try{
				int unaOpcion=unMostrador.menuCrimen(juego.getInterpol());
				switch(unaOpcion){
				case 1: caracteristica = unMostrador.cambiarAtributo("sexo", crimen.getSexoDisponible());
						juego.setSexoDelSospechoso(caracteristica);
						break;
				case 2: caracteristica = unMostrador.cambiarAtributo("hobby", crimen.getHobbyDisponible());
						juego.setHobbyDelSospechoso(caracteristica);
						break;
				case 3: caracteristica = unMostrador.cambiarAtributo("pelo", crimen.getCabelloDisponible());
						juego.setPeloDelSospechoso(caracteristica);
						break;
				case 4: caracteristica = unMostrador.cambiarAtributo("senia", crimen.getSeniaDisponible());
						juego.setSeniaDelSospechoso(caracteristica);
						break;
				case 5: caracteristica = unMostrador.cambiarAtributo("coche", crimen.getCocheDisponible());
						juego.setCocheDelSospechoso(caracteristica);
						break;
				case 6: unMostrador.menuVerSospechosos(juego.listaDeLadronesSospechosos());
						break;
				case 7: pudoEmitirOrdenDeArresto=emitirArresto(unMostrador);
						break;
				case 0:
					datosIngresadosIncorrectos = false;
					break;
				default :
					unMostrador.ingresarOpcionValida();
					break;
				}
			}
			catch(Exception e){
				unMostrador.ingresarOpcionValida();
			}
		}
	}
	
	private static boolean entrarAEdificio(Mostrador unMostrador) throws Exception{
		boolean datosIngresadosIncorrectos = true;
		while(datosIngresadosIncorrectos){
			try{
				int unaOpcion = unMostrador.menuPistas(juego.getCiudadDelPolicia().getEdificiosEnUnaLista());
				if(unaOpcion>0 && unaOpcion<=3){
					if (juego.getNombreCiudadPolicia().compareTo(juego.getNombreCiudadDeEscondite()) == 0){
						boolean acaboElJuego = juego.quePoliciaIntenteAtraparLadron(juego.getCiudadDelPolicia().getEdificiosEnUnaLista().get(unaOpcion-1).getTipoDeEdificio(), juego.getEdificioDeEscondite());
						String mensaje = juego.getMensajeQueTienePolicia();
						unMostrador.mostrar(mensaje);
						if (acaboElJuego){
							juego.guardarJugadores();
						}
						datosIngresadosIncorrectos = false;
						return acaboElJuego;
					}
					else
					{
						String pista = juego.quePoliciaBusquePistaEn(juego.getCiudadDelPolicia().getEdificiosEnUnaLista().get(unaOpcion-1).getTipoDeEdificio());
						unMostrador.mostrarPista(pista);
						datosIngresadosIncorrectos = false;
						return false;
					}
				}
				if(unaOpcion==0){
					datosIngresadosIncorrectos = false;
				}
				else{
					unMostrador.ingresarOpcionValida();
				}
			}
			catch(Exception e){
				unMostrador.ingresarOpcionValida();
			}
		}
		return false;
		
	}
	private static boolean viajarAunaCiudad(Mostrador unMostrador) throws Exception{
		boolean datosIngresadosIncorrectos = true;
		int unaOpcion;
		while(datosIngresadosIncorrectos){
			try{
				unaOpcion = unMostrador.menuViajar(juego.ciudadesDeOpcionParaElJugador());
				if(unaOpcion>0 && unaOpcion<=3){
						Boolean seAcababoElTiempoAlintentarViajar=juego.policiaPudoViajar(juego.ciudadesDeOpcionParaElJugador().get(unaOpcion-1));
					if (!seAcababoElTiempoAlintentarViajar){
						juego.generarCiudadesAlzarParaElPolicia();
						datosIngresadosIncorrectos =false;
						return false;
					}
					else{
						String mensaje = juego.getMensajeQueTienePolicia();
						unMostrador.mostrar(mensaje);
						datosIngresadosIncorrectos =false;
						return true;
					}
				}
				if (unaOpcion==0){
					datosIngresadosIncorrectos =false;
				}
				else{
					unMostrador.ingresarOpcionValida();
				}
			}
			catch(Exception e){
				unMostrador.ingresarOpcionValida();
			}
		}
		return false;
		
	}
	private static void setearJugador(Mostrador unMostrador) throws IOException, ParserConfigurationException, SAXException, TransformerException{
		String nombre = unMostrador.PedirNombre();

		boolean jugadorExiste = juego.setearJugadorActual(nombre);
		if (jugadorExiste){
			juego.asignarRangoApolicia();
			unMostrador.menuJugadorExiste(nombre , juego.getRangoPolicia().toString());
		}
		else{
			juego.AgregarJugador(nombre);
			juego.guardarJugadores();
			unMostrador.menuJugadorNuevo(nombre, juego.getRangoPolicia().toString());
		}
	}
	private static boolean emitirArresto(Mostrador unMostrador){
		Boolean pudoEmitirOrdenDeArresto=juego.emitirArresto();
		if(pudoEmitirOrdenDeArresto){
			unMostrador.mostrar("Orden de arresto fue emitida");
			return true;
		}
		else{
			return false;
		}
	}
}
		